home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Database Designers / Rational Rose 2000 / Rational Setup.EXE / common / lib / Win32 / EventLog.pm < prev    next >
Encoding:
Perl POD Document  |  1998-11-15  |  6.3 KB  |  254 lines

  1. #
  2. # EventLog.pm
  3. #
  4. # Creates an object oriented interface to the Windows NT Evenlog 
  5. # Written by Jesse Dougherty
  6. #
  7.  
  8. package Win32::EventLog;
  9.  
  10. $VERSION = $VERSION = '0.05';
  11.  
  12. require Exporter;
  13. require DynaLoader;
  14. #use Win32;
  15.  
  16. die "The Win32::Eventlog module works only on Windows NT"
  17.     unless Win32::IsWinNT();
  18.  
  19. @ISA= qw( Exporter DynaLoader );
  20. @EXPORT = qw(
  21.     EVENTLOG_AUDIT_FAILURE
  22.     EVENTLOG_AUDIT_SUCCESS
  23.     EVENTLOG_BACKWARDS_READ
  24.     EVENTLOG_END_ALL_PAIRED_EVENTS
  25.     EVENTLOG_END_PAIRED_EVENT
  26.     EVENTLOG_ERROR_TYPE
  27.     EVENTLOG_FORWARDS_READ
  28.     EVENTLOG_INFORMATION_TYPE
  29.     EVENTLOG_PAIRED_EVENT_ACTIVE
  30.     EVENTLOG_PAIRED_EVENT_INACTIVE
  31.     EVENTLOG_SEEK_READ
  32.     EVENTLOG_SEQUENTIAL_READ
  33.     EVENTLOG_START_PAIRED_EVENT
  34.     EVENTLOG_SUCCESS
  35.     EVENTLOG_WARNING_TYPE
  36. );
  37.  
  38. sub AUTOLOAD {
  39.     my($constname);
  40.     ($constname = $AUTOLOAD) =~ s/.*:://;
  41.     # reset $! to zero to reset any current errors.
  42.     $!=0;
  43.     my $val = constant($constname, @_ ? $_[0] : 0);
  44.     if ($! != 0) {
  45.     if ($! =~ /Invalid/) {
  46.         $AutoLoader::AUTOLOAD = $AUTOLOAD;
  47.         goto &AutoLoader::AUTOLOAD;
  48.     }
  49.     else {
  50.         my ($pack,$file,$line) = caller;
  51.         die "Unknown Win32::EventLog macro $constname, at $file line $line.\n";
  52.     }
  53.     }
  54.     eval "sub $AUTOLOAD { $val }";
  55.     goto &$AUTOLOAD;
  56. }
  57.  
  58.  
  59. #
  60. # new()
  61. #
  62. #   Win32::EventLog->new("source name", "ServerName");
  63. #
  64. sub new
  65. {
  66.     my $c = shift;
  67.     die "usage: PACKAGE->new(SOURCENAME[, SERVERNAME])\n" unless @_;
  68.     my $source = shift;
  69.     my $server = shift;
  70.     my $handle;
  71.  
  72.     # Create new handle
  73.     OpenEventLog($handle, $server, $source);
  74.     return bless  {'handle' => $handle,
  75.            'Source' => $source,
  76.            'Computer' => $server }, $c;
  77. }
  78.  
  79. #
  80. # Open (the rather braindead old way)
  81. # A variable initialized to empty must be supplied as the first
  82. # arg, followed by whatever new() takes
  83. #
  84. sub Open {
  85.     $_[0] = Win32::EventLog->new($_[1],$_[2]);
  86. }
  87.  
  88. sub Backup
  89. {
  90.     $self = shift;
  91.     die " usage: OBJECT->Backup(FILENAME)\n" unless @_ == 1;
  92.     my $filename = shift;
  93.     my $result;
  94.  
  95.     $result = BackupEventLog($self->{'handle'},$filename);
  96.     unless ($result) { $! = Win32::GetLastError() }
  97.     return $result;
  98. }
  99.  
  100. # Read
  101. # Note: the EventInfo arguement requires a hash reference.
  102. sub Read
  103. {
  104.     $self = shift;
  105.  
  106.     die "usage: OBJECT->Read(FLAGS, RECORDOFFSET, HASHREF)\n" unless @_ == 3;
  107.  
  108.     my ($readflags,$recordoffset) = @_;
  109.     my ($result, $datalength, $dataoffset, $sid, $length);
  110.     my ($reserved, $recordnumber, $timegenerated, $timewritten, $eventid);
  111.     my ($eventtype, $numstrings, $eventcategory, $reservedflags);
  112.     my ($closingrecordnumber, $stringoffset, $usersidlength, $usersidoffset);
  113.  
  114.     # The following is stolen shamelessly from Wyt's tests for the registry. 
  115.  
  116.     $result = ReadEventLog($self->{'handle'},
  117.                $readflags,
  118.                $recordoffset,
  119.                $header,
  120.                $source,
  121.                $computer,
  122.                $sid,
  123.                $data,
  124.                $strings);
  125.  
  126.     ($length,
  127.      $reserved,
  128.      $recordnumber,
  129.      $timegenerated,
  130.      $timewritten,
  131.      $eventid,
  132.      $eventtype,
  133.      $numstrings,
  134.      $eventcategory,
  135.      $reservedflags,
  136.      $closingrecordnumber,
  137.      $stringoffset,
  138.      $usersidlength,
  139.      $usersidoffset,
  140.      $datalength,
  141.      $dataoffset) = unpack('l6s4l6', $header);
  142.  
  143.     # get the text message here
  144.     my $message='';
  145.     GetEventLogText($source, $eventid, $strings, $numstrings, $message) if ($result);
  146.  
  147.     # make a hash out of the values returned from ReadEventLog.
  148.     my %h = ( 'Source'            => $source,
  149.           'Computer'        => $computer,
  150.           'Length'            => $datalength,
  151.           'Category'        => $eventcategory,
  152.           'RecordNumber'        => $recordnumber,
  153.           'TimeGenerated'        => $timegenerated,
  154.           'Timewritten'        => $timewritten,
  155.           'EventID'            => $eventid,
  156.           'EventType'        => $eventtype,
  157.           'ClosingRecordNumber'    => $closingrecordnumber,
  158.           'User'            => $sid,
  159.           'Strings'            => $strings,
  160.           'Data'            => $data,
  161.           'Message'            => $message,
  162.         );
  163.  
  164.     if (ref($_[2]) eq 'HASH') {
  165.     %{$_[2]} = %h;        # this needed for Read(...,\%foo) case
  166.     }
  167.     else {
  168.     $_[2] = \%h;
  169.     }
  170.     unless ($result) { $! = Win32::GetLastError() }
  171.     return $result;
  172. }
  173.  
  174. sub Report
  175. {
  176.     my $self = shift;
  177.     
  178.     die "usage: OBJECT->Report( HASHREF )\n" unless @_ == 1;
  179.  
  180.     my $EventInfo = shift;
  181.     my $result;
  182.  
  183.     if ( ref( $EventInfo)  eq "HASH" ) {
  184.     my ($length, $reserved, $recordnumber, $timegenerated, $timewritten);
  185.     my ($eventid, $eventtype, $numstrings, $eventcategory, $reservedflags);
  186.     my ($closingrecordnumber, $stringoffset, $usersidlength);
  187.     my ($usersidoffset, $source, $data, $strings);
  188.  
  189.     $eventcategory        = $EventInfo->{'Category'};
  190.     $source            = $self->{'Source'};
  191.     $computer        = $self->{'Computer'};
  192.     $length            = $EventInfo->{'Length'};
  193.     $recordnumber        = $EventInfo->{'RecordNumber'};
  194.     $timegenerated        = $EventInfo->{'TimeGenerated'};
  195.     $timewritten        = $EventInfo->{'Timewritten'};
  196.     $eventid        = $EventInfo->{'EventID'};
  197.     $eventtype        = $EventInfo->{'EventType'};
  198.     $closingrecordnumber    = $EventInfo->{'ClosingRecordNumber'};
  199.     $strings        = $EventInfo->{'Strings'};
  200.     $data            = $EventInfo->{'Data'};
  201.  
  202.     $result = WriteEventLog($computer,
  203.                 $source,
  204.                 $eventtype,
  205.                 $eventcategory,
  206.                 $eventid,
  207.                 $reserved,
  208.                 $data,
  209.                 $strings);
  210.     } 
  211.     else {
  212.     die "Win32::EventLog::Report requires a hash reference as arg 3\n";
  213.     }
  214.  
  215.     unless ($result) { $! = Win32::GetLastError() }
  216.     return $result;
  217. }
  218.  
  219. sub GetOldest
  220. {
  221.     my $self=shift;
  222.         
  223.     die "usage: OBJECT->GetOldest( SCALAREF )\n" unless @_ == 1;
  224.     my $result = GetOldestEventLogRecord( $self->{'handle'},$_[0]);
  225.     unless ($result) { $! = Win32::GetLastError() }
  226.     return $result;
  227. }
  228.  
  229. sub GetNumber
  230. {
  231.     my $self=shift;
  232.  
  233.     die "usage: OBJECT->GetNumber( SCALARREF )\n" unless @_ == 1;
  234.     my $result = GetNumberOfEventLogRecords($self->{'handle'}, $_[0]);
  235.     unless ($result) { $! = Win32::GetLastError() }
  236.     return $result;
  237. }
  238.  
  239. sub Clear
  240. {
  241.     my $self=shift;
  242.  
  243.     die "usage: OBJECT->Clear( FILENAME )\n" unless @_ == 1;
  244.     my $filename = shift;
  245.     my $result = ClearEventLog($self->{'handle'}, $filename);
  246.     unless ($result) { $! = Win32::GetLastError() }
  247.     return $result;
  248. }
  249.  
  250. bootstrap Win32::EventLog;
  251.  
  252. 1;
  253. __END__
  254.